import {
  _decorator,
  Collider2D,
  Component,
  Contact2DType,
  director,
  Input,
  input,
  instantiate,
  Node,
  Prefab,
  Vec3,
} from "cc"
const { ccclass, property } = _decorator

@ccclass("PlayerController")
export class PlayerController extends Component {
  // 子弹预制体
  @property({ type: Prefab })
  public bulletPrefab: Prefab | null = null

  // 敌机预制体
  @property({ type: Prefab })
  public enemyPrefab: Prefab | null = null

  // 是否死亡
  isDie: boolean = false

  start() {
    // 注册碰撞
    let collider = this.getComponent(Collider2D)
    if (collider) {
      // tips：该项目只需要使用到最简单的碰撞系统Builtin 2D,文档中说，此碰撞系统只会产生两个事件回调
      // tips: BEGIN_CONTACT 和 END_CONTACT 回调消息
      collider.on(Contact2DType.BEGIN_CONTACT, this.contactBeginHandler, this)
    }
    // 监听用户的移动行为
    input.on(Input.EventType.TOUCH_MOVE, this.moveHandler)
    this.generateBullet()
    this.generateEnemy()
  }

  update(deltaTime: number) {}

  moveHandler(e) {
    if (!this.isDie) {
      // 设置世界坐标，获取ui位置
      this.node.setWorldPosition(
        new Vec3(e.getUILocation().x, e.getUILocation().y, 0)
      )
    } else {
      input.off(Input.EventType.TOUCH_MOVE, this.moveHandler)
    }
  }
  /**
   * 创建子弹
   */
  generateBullet() {
    // 不间断发射子弹
    this.schedule(() => {
      // 实例化子弹
      let bullet = instantiate(this.bulletPrefab)
      // 将子弹实例添加到场景中,通过导演类直接添加到当前的主场景
      // bullet.setParent(director.getScene())
      bullet.setParent(this.node.getParent())
      // this.node.parent.addChild(bullet)
      // 设置子弹位置，在飞机的上面
      bullet.setPosition(
        new Vec3(this.node.position.x, this.node.position.y + 70, 0)
      )
    }, 0.1)
  }

  /**
   * 创建敌机
   */
  generateEnemy() {
    // x在-214至214之间随机分布，但是间隔必须超过36
    // y值固定371
    this.schedule(() => {
      let num = Math.round(-214 + (214 + 214) * Math.random())
      let enemy = instantiate(this.enemyPrefab)
      enemy.setParent(this.node.getParent())
      enemy.setPosition(new Vec3(num, Math.random() * 100 + 371, 0))
    }, 0.5)
  }

  // 碰撞检测
  contactBeginHandler(_, otherCollider: Collider2D) {
    // 说明碰到了敌机，销毁自己
    if (otherCollider.tag === 1) {
      this.isDie = true
      this.node.destroy()
    }
  }
}
